package com.migration.util;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * JSON处理工具类
 */
@Slf4j
@Component
public class JsonUtils {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 从JSON字符串中获取指定字段的值
     *
     * @param json JSON字符串
     * @param fieldName 字段名
     * @return 字段值，如果解析失败则返回null
     */
    public static String getStringValue(String json, String fieldName) {
        if (json == null || json.trim().isEmpty()) {
            return null;
        }

        try {
            JsonNode rootNode = objectMapper.readTree(json);
            JsonNode fieldNode = rootNode.get(fieldName);

            if (fieldNode == null || fieldNode.isNull()) {
                return null;
            }

            return fieldNode.asText();
        } catch (Exception e) {
            log.error("解析JSON字段失败: {} - {}", fieldName, e.getMessage());
            return null;
        }
    }

    /**
     * 从JSON字符串中获取整数字段
     *
     * @param json JSON字符串
     * @param fieldName 字段名
     * @return 整数值，如果解析失败则返回null
     */
    public static Long getLongValue(String json, String fieldName) {
        String value = getStringValue(json, fieldName);
        if (value == null) {
            return null;
        }

        try {
            return Long.parseLong(value);
        } catch (NumberFormatException e) {
            log.error("解析整数字段失败: {} - {}", fieldName, e.getMessage());
            return null;
        }
    }

    /**
     * 将JSON数组字符串解析为List<Map<String, Object>>
     *
     * @param json JSON数组字符串
     * @return List<Map<String, Object>>，如果解析失败则返回空列表
     */
    public static List<Map<String, Object>> parseJsonToList(String json) {
        if (json == null || json.trim().isEmpty()) {
            return new ArrayList<>();
        }

        try {
            return objectMapper.readValue(json, 
                   objectMapper.getTypeFactory().constructCollectionType(List.class, Map.class));
        } catch (Exception e) {
            log.error("解析JSON数组失败: {} - {}", json, e.getMessage());
            return new ArrayList<>();
        }
    }

}
